//
//  main.m
//  Day10
//
//  Created by dllo on 16/5/17.
//  Copyright © 2016年 lanou. All rights reserved.
//

#import <Foundation/Foundation.h>
void test ();

//全局变量
static int f = 10;
//1.只初始化一次
//2.如果初始化未赋初值,默认值为0.
//3.静态变量的空间只有程序退出才释放(程序运行期间永远存在).
int exchange(){
    return 1;
}

int main(int argc, const char * argv[]) {
#if 0
    //栈区 内存由系统自动管理  函数内写的东西都存入栈区  满足先进后出的特点. 作用域在函数结束时,释放.
    int a = 10; //局部变量
    printf("a = %p\n", &a);
    
    //堆区 五个存储区域里程序员使用最多的区域, 内存的开辟和释放都由程序员手动管理.满足队列先进先出的特点FIFO;
    int *p = alloca(10);
    printf("p = %p\n", p);
    
    //静态区 也叫全局区,全局区的内容作用域是整个程序的运行期间都会存在.用static关键词修饰,只初始化一次.如果没有赋初值,默认是0.
    static int b = 10;
    printf("b = %p\n", &b);
    
    //常量区 所有常量都存放在常量区: 10  , 'a' ,"arthur"
    char str[] = "iPhone";
    printf("str = %p\n", str);
    
    
    //代码区 所有编写的源代码,都被编译成二进制的文件存储在代码区.
    
    //函数
    printf("函数 = %p\n", exchange);
    
    
    //常量区的内容不可修改
//    char *ps =strings();
//    char *pss ="yyyyyy";
//    pss[0] = 'B';
    //commond + shift + k  清除警告及错误
    
    
//    test();
#endif
    
    
#if 0
    //动态内存分配函数
//    void *malloc (size)
    // void * :泛型指针: 可以代表任意类型的指针.
 // size: 申请大小为size的字节
    //申请一块内存空间
    int *p = malloc(sizeof(int) * 3);
    // 操作这块内存
    *p = 10;
    //释放内存:释放内存并不是真正的清除这块内存,而是改变当前这块内存的使用状态,并不会清除里面的内容.
    free(p);
    //将指针置空
    p = NULL;
    
    
    
#endif
    
#if 1
    //动态排序
    Student stu1 = {"张三" ,69.5};
    Student stu2 = {"李四" ,99.5};
    Student stu3 = {"王五" ,89.5};
    
    
#endif
    
    
    
    return 0;
}



void test () {
    //栈区的内容每次调用都会重新分配内存,生命周期直到作用域结束.
    int a = 0;
    //static 修饰局部变量:会改变局部变量的生命周期,将本是栈区的变量变成静态区存储,生命周期随程序的启动而启动,程序的结束而结束.且只初始化一次.
    static int b = 0;
    a++;
    b++;
    printf("a = %d\n", a);
    printf("b = %d\n", b);
}

double s(double r){
    //static的应用场景:应用于使用频次高,且值不经常改变的情况下,应使用static修饰变量.确保只初始化一次.这样有助于程序的性能和速度的提升.
    static double pi = 3.141592653;
    return r * r * pi;
}
